package com.tuanzhang.zhw.rpc.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * 解码器
 */
public class RpcDecoder extends ByteToMessageDecoder {

    private Class<?> genericClass;

    public RpcDecoder(Class<?> genericClass) {
        this.genericClass = genericClass;
    }

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {

        // 数据包小于4 等待下次在读取
        if(byteBuf.readableBytes() < 4){
            return;
        }
        //添加读标识
        byteBuf.markReaderIndex();
        // 包头
        int dataLength = byteBuf.readInt();
        if(byteBuf.readableBytes() < dataLength){
            // 如果当前指针的实际内容小于包头记录的长度，则代表还没读完，重置读指针到标志位
            byteBuf.resetReaderIndex();
            return;
        }

        byte[] data =new byte[dataLength];
        byteBuf.readBytes(data);
        Object obj = ProtostuffUtils.deserialize(data,genericClass);
        //反序列化添加到buffer中 传播到下游handler处理
        list.add(obj);
    }
}
